package com.example.system.domain;

import com.alibaba.fastjson.annotation.JSONField;
import com.baomidou.mybatisplus.annotation.*;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

import com.example.util.StringSplitUtil;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;

/**
 * 
 * @TableName bus_system_table_user
 */
@TableName(value ="bus_system_table_user")
@Data
public class BusSystemTableUser implements Serializable {
    /**
     * 主键id
     */
    @TableId(type = IdType.ASSIGN_UUID)
    private String uuid;

    /**
     * 用户id
     */
    private String userid;

    /**
     * 表名编号
     */
    private String tableNo;

    /**
     * 真实数据表
     */
    private String tableNode;

    /**
     * 创建时间
     */
    @TableField(fill = FieldFill.INSERT) // 自动填充创建时间
    private Date createTime;

    /**
     * 更新时间
     */
    @TableField(fill = FieldFill.INSERT_UPDATE) // 自动填充更新时间
    private Date updateTime;

    /**
     *
     */
    @TableLogic
    private Integer isDeleted;

    /**
     * 节点id
     */
    private String nodeId;


    private String tableName;

    /**
     * 获取保存数据的表,(一般是后接上来的一张表)
     * @return
     */
    @JsonIgnore
    public String getSaveTableName(){
        List<String> tables= StringSplitUtil.splitToList(this.tableNode);
        if(!tables.isEmpty()){
            return tables.get(tables.size()-1);
        }
        return "";
    }

    @JsonIgnore
    public List<String> getTableList(){
        List<String> tables= StringSplitUtil.splitToList(this.tableNode);
        return tables;
    }

    /**
     * 生成多表 UNION ALL查询 SQL
     * @param userIdColumn 用户ID字段名（默认为user_id）
     * @return 生成的SQL
     */
    @JsonIgnore
    private String generateUnionAll(String userIdColumn) {
        List<String> tableNames= StringSplitUtil.splitToList(this.tableNode);
        if (tableNames.isEmpty()) {
            throw new IllegalArgumentException("表名列表不能为空");
        }
        String userColumn = userIdColumn != null ? userIdColumn : "user_id";

        return tableNames.stream()
                .map(tableName ->
                        String.format("SELECT * FROM %s WHERE %s = '%s'",
                                tableName, userColumn, this.userid))
                .collect(Collectors.joining(" UNION ALL "));
    }

    @JsonIgnore
    public String generateUnionAllTable(String userIdColumn) {
        String sql=this.generateUnionAll(userIdColumn);
        return String.format("( %s ) as %s",sql,this.tableName);
    }

    @JsonIgnore
    public String generateUnionAllTableUserId(){
        return this.generateUnionAllTable("user_id");
    }

}